#!/usr/bin/env python
# -*- coding:utf-8 -*-

optCode = {
    'mov': "赋值,将源操作数复制到目的操作数,mov EAX[目的数],0x4000[源数].",
    'movzx':'mov的全零扩展指令,将较小的源操作数扩展后复制到目的操作数,mov EAX[32位],bx[16位].',
    'movsx':'有符号数扩展赋值,将较小有符号源操作数扩展后复制到目的操作数,mov EAX[32位],10101010b.',
    'lahf':'将标志位寄存器eflags低字节8位赋值到ah寄存器中.',
    'sahf':'将ah寄存器的内容复制到标志位寄存器eflags的低字节8位中.',
    'xchg':"数据交换,xchg EAX,EDX.",
    'inc':"操作数加一,影响标志位寄存器.",
    'des':"操作数减一,影响标志位寄存器.",
    'add':"长度相同的目的操作数和源操作数相加最终赋值给目的操作数[影响标志位寄存器],add EAX,EDX.",
    'sub':"长度相同的目的操作数减去源操作数最终赋值给目的操作数[影响标志位寄存器],sub EAX,EDX.",
    'neg':'操作数按位取反后加1[影响标志位寄存器].',
    'lodsb':'将ESI寄存器指向的内存值中的一个字节赋值到AL寄存器同时同时DF[方向寄存器]=0,ESI值加1,DF=1,则ESI减1.',
    'lodsw':'将ESI寄存器指向的内存值中的一个字[两个字节]赋值到AX寄存器同时DF[方向寄存器]=0,ESI值加2;DF=1,则ESI减2.',
    'lodsd':"将ESI寄存器指向的内存值中的两个字[四个字节]赋值到EAX寄存器同时DF[方向寄存器]=0,ESI值加4;DF=1,则ESI减4.",
    'offset':"返回变量距离数据段起始地址的距离,用于定位内存地址[简单理解成得到数组的首地址],byteVal Byte 1;mov ESI,offset byteVal.",
    'align': "内存地址对齐指令,对齐数[1,2,4,8,16],align 2.",
    'ptr':"指定被操作数的大小, mov ax,word[一个字] ptr [EDX].",
    'type':'返回操作数的大小,单位是字节,也是用来定址, byteVal Byte 1; type byteVal[返回1].',
    'lengthof': "返回数组的元素个数,byteArr Byte 1,2,3; lengthof byteArr[返回3].",
    'label':"可以这样理解:定义指向已分配内存的指针,本身不为变量分配内存,byteVal label Byte.",
    'jmp':'无条件跳转指令,jmp 0x04001000[EIP=0x04001000].',
    'loop':'循环指令,根据ECX值循环执行代码块,循环一次ECX减一,mov ecx,5;run:inc ax;loop run.',
    'push':'压栈,[16]ESP-2,[32]ESP-4.',
    'pop': '弹栈,[16]ESP+2,[32]ESP+4.',
    'pushfd':'将EFLAGS标志寄存器的值压栈.',
    'popfd':'将ESP指向的栈顶值弹给EFLAGS标志寄存器.',
    'pushad':'将各寄存器按EAX,ECX、EDX、EBX、ESP、EBP、ESI、EDI的顺序压栈.',
    'popad':'将栈中存的值弹给各寄存器,因为栈的特性，先进的后出.',
    'pusha':'将16位寄存器按AX、CX、DX、BX、SP、BP、SI、DI顺序压栈.',
    'popa':'将栈中存的值弹给各16位寄存器,因为栈的特性，先进的后出.',
    'call':'到新地址开始执行,并将下一条待执行的指令压栈,可以理解为函数调用.',
    'ret':'返回到Call指令的下一条指令执行,就是将Call指令压入栈中的地址弹给EIP.',
    'xor':'按位异或指令,异或规则,相异为真[1],相同为假[0],两个相同的操作数异或结果为0',
    'int':'中断指令,根据中断号跳转到对应的程序处理入口,同时将eflags标志寄存器、CS和EIP寄存器入栈,并将eflags寄存器中TF和IF置为0'

}